package datos.gestores;

import java.io.File;
import java.io.FileWriter;
import java.util.Scanner;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;

import datos.entidades.Ruta;



public class GestorDatosRutas implements GestorDatos {

	private static int cantRutas;
	private static List <Ruta> rutas;
	private File dataFile;
	
    public GestorDatosRutas () {
    }

    public GestorDatosRutas (String filePath) {				 // Constructor de la clase.
    	System.out.println(filePath);
		rutas = new ArrayList <Ruta>();
		cantRutas = 0;
		this.dataFile = new File (filePath);
    }
    
    public void set (int idx, Object ruta) {
    	
    	rutas.set(idx, (Ruta) ruta);
    }

    public boolean remove (Object ruta) {
    	boolean exito;
    	exito = rutas.remove((Ruta) ruta);
    	if (exito == true)
    		setCantRutas(getCantRutas()-1);
    	return exito;
    }
    
    public void remove (int idx) {
    	
    	rutas.remove(idx);
    	setCantRutas(getCantRutas()-1);
    	
    }

    public Object get (int idx) {
        Object ruta;
    	
        ruta = rutas.get(idx);
    	return ruta;
    }

    public boolean add (Object ruta){
    	boolean exito;
    	
    	exito = rutas.add((Ruta) ruta);
    	if (exito == true)
    		setCantRutas(getCantRutas()+1);
    	
    	return exito;
    }

    public void listar () {
    	
        Iterator<Ruta> iter = rutas.iterator();
        
        while (iter.hasNext())
          System.out.println(iter.next());
        
    }

    public void loadData () throws IOException {	 // Carga en memoria la info contenida en el archivo de rutas.
        Scanner input = new Scanner (dataFile);
    	cantRutas = input.nextInt();
    	for (int i = 0 ; i < cantRutas ; i++ ) {
			Ruta nuevaRuta = new Ruta();
			nuevaRuta.setIdRuta(input.nextInt());
			System.out.println("ID RUTA: " + i);
			input.findInLine(PAT);
			while (!input.hasNext(PAT)) {
				nuevaRuta.addDescripcion(input.next());
			}			
			input.findInLine(PAT);
			nuevaRuta.setDistancia(input.nextInt());
			nuevaRuta.setKmBuenEstado(input.nextInt());
			nuevaRuta.setKmMalEstado(input.nextInt());
			if (input.next().equalsIgnoreCase("si"))
				nuevaRuta.setInternacional(true);			
			else 
				nuevaRuta.setInternacional(false);
			
			rutas.add(nuevaRuta);
    	}
    }
	 
    public void saveData () throws IOException {	// Graba en el archivo rutas los datos almacenados en memoria.
    	PrintWriter out = new PrintWriter(new FileWriter(dataFile));
		String s = "";
		s = Integer.toString(cantRutas);
		out.println(s);
		s = "";
		out.println(s);
		for (int i = 0 ; i < cantRutas ; i++ ){			
			s = s.concat(Integer.toString(rutas.get(i).getIdRuta())).concat(" ")					  
					  .concat(PAT).concat(" ")
					  .concat(rutas.get(i).getDescripcion()).concat(" ")
					  .concat(PAT).concat(" ")
					  .concat(Integer.toString(rutas.get(i).getDistancia())).concat(" ")
					  .concat(Integer.toString(rutas.get(i).getKmBuenEstado())).concat(" ")
					  .concat(Integer.toString(rutas.get(i).getKmMalEstado())).concat(" ")
					  .concat(rutas.get(i).getInternacional()?"si":"no")
					  .concat("no").concat(" ");
			out.println(s);
			s = "";
		}
		out.close();
    }

// ****************************************************************************************************************************************//
// ** METODOS ADICIONALES DEL GESTOR
// ****************************************************************************************************************************************//

    public int indexOf (Object ruta) {
    	int idx;
    	
    	idx = rutas.indexOf((Ruta) ruta);
    	
        return idx;
    }

    public void getIdRutas(List <String> idRutas) {
        for (int i = 0 ; i < rutas.size() ; ++i)
        	idRutas.add(i, Integer.toString(rutas.get(i).getIdRuta()));
        
    }
    
	public void setCantRutas(int cantRutas) {
		GestorDatosRutas.cantRutas = cantRutas;
	}

	public int getCantRutas() {
		return cantRutas;
	}

	public static void setRutas(List <Ruta> rutas) {
		GestorDatosRutas.rutas = rutas;
	}

	public static List <Ruta> getRutas() {
		return rutas;
	}

    public int indexOf (int id ) {		
    	// Se le pasa un string de las lista y devuelve el id correspondiente. Si no existe el string devuelve -1
		
    	int i = 0;
		int cantReg = getCantRutas();
    	while ((i <= cantReg) && (((Ruta)get(i)).getIdRuta() != id )) i++;
		if (i <= cantReg) return i;
		else return -1;

    }
}

